#pragma once

#include <iostream>
#include <string>
#include <cstring>
#include <cstdio>

#include <cstdarg>
#include <ctime>

#define DEBUG 0
#define NORMAL 1
#define WARNING 2
#define ERROR 3
#define FATAL 4

const char *glevelMap[] = {
    "DEBUG",
    "NORMAL",
    "WARNING",
    "ERROR",
    "FATAL"};

#define LOGFILE "./calculator/log"

// 完整的日志功能，至少：日志等级，时间，支持用户自定义(日志内容，文件行，文件名)
// 可变参数列表
void logMessage(int level, const char *format, ...)
{
    // 条件编译
#ifndef DEBUG_SHOW
    if (level == DEBUG)
        return;
#endif

    // va_list ap;
    // va_start(ap, format);
    // int x = va_arg(ap, int);
    // va_end(ap);  // ap == nullptr
    char stdBuffer[1024]; // 标准部分
    time_t timestamp = time(nullptr);
    // struct tm* localtime = localtime(&timestamp);
    snprintf(stdBuffer, sizeof(stdBuffer), "[%s] [%ld] ", glevelMap[level], timestamp);

    char logBuffer[1024]; // 自定义部分
    va_list args;
    va_start(args, format);
    vprintf(format, args);
    vsnprintf(logBuffer, sizeof logBuffer, format, args);
    va_end(args);

    FILE *fp = fopen(LOGFILE, "a");
    // printf("%s%s\n", stdBuffer, logBuffer);
    fprintf(fp, "%s%s\n", stdBuffer, logBuffer);
    fclose(fp);

    return;
}
